我們在寫 Shell Script 的過程中,有時會需要將資料放到一個暫存檔中使用,等到用完後,Script 再把這個暫存檔刪掉。例如使用 ls 把某個目錄底下的 mp4 檔找出來,並把找出的 mp4 檔列表存到一個空白文件裡,之後的程式或迴圈就可以導入這份列表來使用,程式結束後再將該列表給刪除。
通常我們可以自訂檔案的名稱,並將內容寫入這個空白檔案,不過自訂名稱有可能與目的資料夾裡的檔案撞名,或是需要自訂的暫存檔太多,實在懶得想檔名,這時候我們就可以使用 mktemp 這個指令來完成我們的需求。
mktemp 基本用法
直接執行 mktemp 指令,就會在 /tmp 資料夾裡新增一個暫存檔,預設檔名格式為 tmp.XXXXXXXXXX
mktemp
# 執行結果:
/tmp/tmp.OVWLPZlo5K
建立暫存資料夾
加上 -d 參數,就可以在 /tmp 中建立一個暫存資料夾而非檔案
mktemp -d
# 執行結果:
/tmp/tmp.C8Uhfp3qDJ
檢查該檔案的格式
file /tmp/tmp.C8Uhfp3qDJ/
# 執行結果:
/tmp/tmp.C8Uhfp3qDJ/: directory
建立固定格式的暫存檔
在 mktemp 指令後接上想要的格式,並且檔名格式中必須包含至少三個連續的「X」,例如我希望暫存檔的開頭是 2020-09-07,日期後面再接上三個亂數:
mktemp 2020-09-07-XXX
# 執行結果:
2020-09-07-MWF
mktemp 2020-09-07-XXX
# 執行結果:
2020-09-07-ygG
「X」可以在檔名中的任何地方,只要確保至少有三個連續的 X 即可
指定暫存檔的路徑
mktemp 預設會將暫存檔或資料夾放到 /tmp 底下(並且權限為 600 或 700),加上 -p 參數可指定檔案或目錄要存放的位置
mktemp -p /home
# 執行結果:
/home/tmp.LikeDj0mCL
在 Shell Script 中建立暫存檔並賦值給變數
tmpFile=$(echo $(mktemp))
上面的用法會使用 mktemp 建立一個隨機檔名的暫存檔,並且賦值給變數 tmpFile,下面用一個簡單的 script 來做範例,檔名就取作 mktemp.sh
#!/bin/bash
# 建立兩個亂數的空白檔案,並分別賦值給變數 tmpFile1 與 tmpFile2
tmpFile1=$(echo $(mktemp))
tmpFile2=$(echo $(mktemp))
# 將 Hello 存到變數 tmpFile1、World 存到 tmpfile2,並且讀取兩個變數,檢查是否有正確寫入
echo "Hello" > $tmpFile1
echo "content in tmpFile1: "
cat $tmpFile1
echo -e "\n"
echo "World" > $tmpFile2
echo "content in tmpFile2: "
cat $tmpFile2
為檔案加上執行權限
chmod +x mktemp.sh
最後執行 Script 應該會出現下面的結果:
bash ./mktemp.sh
# 執行結果:
content in tmpFile1:
Hello
content in tmpFile2:
World
看到兩個檔案內容分別為 Hello 與 World,表示 mktemp 建立的隨機檔名有正確的賦值!